package ru.gosoplata.controller 
{
	import flash.external.ExternalInterface;
	import ru.gosoplata.model.TmpModel;
	import ru.gosoplata.service.conn.BillAcceptor;
	import scr.ScreenCoinOUT;
	import scr.ScreenPay;
	/**
	 * ...
	 * @author 
	 */
	public class TmpGlobalController 
	{
		
		public function TmpGlobalController() 
		{
			
		}
		
		public function initFun():void 
		{
			
		}
		//TODO: контроллеры 	mediator	->	event	->	controller
		//						model		->	event	->	mediator
		// 						servise		->	event	->	controller
		public function controllerClick(btnType:String):void 
		{
			if (btnType == 'back') 
			{
				TmpModel.screenController.gotoBack();
			}
			else if (btnType == 'menu') 
			{
				TmpModel.screenController.gotoIndexHTML();
			}
		}
		public function controllerSelectProvider(id:String):void 
		{
			TmpModel.payment.toProvider(id);
			controllerOnProviderSelected();//TODO: event
		}
		public function controllerSerchProvider(str:String):void 
		{
			TmpModel.payment.serchProvider(str);
			controllerOnProviderSelected();//TODO: event
		}
		public function controllerOnProviderSelected():void
		{
			TmpModel.debugOutput.add("controllerSelectProvider provider id:" + TmpModel.payment.provider.id + " folder:" + TmpModel.payment.provider.folder + " ");
			if (TmpModel.payment.provider.isFolder) 
			{
				if (TmpModel.payment.provider.folder == '') 
				{
					TmpModel.screenController.showScreenByName("index_services");//TODO: а какая разница! можно и их как choose_provider
				}else {
					TmpModel.screenController.showScreenByName("choose_provider");
				}
			}else 
			{				
				//TODO: проверка возможности платежа на данного провайдера
				if (TmpModel.payment.provider.folder == "wc") 
				{
					TmpModel.acceptor.wcStatus(	function (status:Object):void 
												{
													TmpModel.wcData.parseStatus(status['WcStatus']);
													TmpModel.debugOutput.add(JSON.stringify(status));
													if (TmpModel.wcData.availabel) 
													{
														TmpModel.payment.validateAccount("wc");
														controllerValidatorOn();
													}else 
													{
														TmpModel.screenController.showScreenByName("wc_closed");
													}
												});
				}else 
				{
					/* TODO: проверка возможности платежа на данного провайдера - вот такая захардкоженная хуета)))
					Короче так. Хардкод убери вообще. Отображать список всех провайдеров, которые в /req/providers в виде дерева приходят из конфига.*/
					//if (TmpModel.payment.provider.providerID == "1000014" || TmpModel.payment.provider.providerID == "1000040" || TmpModel.payment.provider.providerID == "1000167")
					//{
						//TmpModel.screenController.showScreenByName("index_services");
						//return;
					//}
					
					
					TmpModel.payment.accauntnumber = "";
					TmpModel.payment.clearExtraData();
					if (TmpModel.payment.provider.folder == "cellular")
					{
						TmpModel.screenController.showScreenByName("enter_phone");
					}else
					{
						TmpModel.screenController.showScreenByName("enter_userdata");
					}
				}
			}
		}
		public function controllerValidatorOn():void 
		{
			TmpModel.acceptor.validatorOn(	function (variables:Object):void 
											{
												if (variables["ValOn"]=="true") 
												{
													TmpModel.payment.amount = TmpModel.payment.amount;
													TmpModel.payment.addAction('ValOff');
													TmpModel.screenController.showScreenByName("pay");
												}else 
												{
													TmpModel.acceptor.writeLog('controllerValidatorOn ERROR: не удалось включить прием денег.');
													TmpModel.screenController.gotoIndexHTML();
												}
											});
		}
		public function controllerValidatorOff():void 
		{
			//TODO: может совместить validatorOff и createPay
			TmpModel.acceptor.validatorOff(	function (variables:Object):void 
											{
												TmpModel.debugOutput.add(JSON.stringify(variables));
												if (variables["ValOff"]=="true") 
												{
													TmpModel.debugOutput.add("ValOff "+JSON.stringify(TmpModel.payment));
													if (TmpModel.payment.amount > 0)
													{
														if (TmpModel.payment.forEnrollment == 0) 
														{
															TmpModel.payment.addAction('payBack');//TODO: это вариант когда коммиссия фиксированная а пользователь внес меньше коммисси... ехе сдачу не выдает - так не работает...
														}
														TmpModel.payment.addAction('createPay');
														controllerFinishPay();
													}else 
													{
														// если есть страница - то выход по таймауту
														// иначе надали кнопку бэк
														var page:String = TmpModel.payment.getPage();
														if(page!="")TmpModel.screenController.showScreenByName(page);
														else TmpModel.screenController.gotoBack();
													}
												}else 
												{
													//TODO: не выключится не может. если только по таймауту из флэша (еще не работающий механизм) - тоесть ехе тупо не ответил.
													TmpModel.screenController.gotoIndexHTML();
												}
											});
		}
		
		public function controllerSkipPayBack():void 
		{
			TmpModel.payment.payBack = 0;
			TmpModel.acceptor.writeLog("скипнул использование сдачи.")
			controllerFinishPay();
		}
		public function controllerFinishPay():void //TODO: возможно все onClick заменить на controllerFinishPay. так будет работать кнопка далее автоматически. не продумал пока бэк и меню. - что то мне уже не нравится совсем этот вариант!!!!!!!!!!!!!!!!!!!!!!!
		{
			var action:String = TmpModel.payment.getAction();
			
			TmpModel.debugOutput.add("controllerFinishPay action:"+action);
			
			if (action=='printCheck') 
			{
				// укороченный вариант
				TmpModel.acceptor.printCheck(	function (variables:Object):void 
												{
													var ar:Array = String(variables['PrintEnd']).split(';');
													
													TmpModel.debugOutput.add("controllerFinishPay operation:"+TmpModel.payment.operation+" payBack:"+TmpModel.payment.payBack+' '+JSON.stringify(variables));
													if (TmpModel.payment.payBack>0) 
													{
														TmpModel.payment.operation = ar[0];
													}
													
													//if (TmpModel.payment.payBack != uint(ar[1])) //TODO: обработка ошибки - теперь нельзя. мы сами устанавливаем payBack 0 по таймауту
													//{
														//TmpModel.payment.payBack = ar[1];
													//}
													
													if (TmpModel.payment.operation.length > 5) 
													{
														TmpModel.payment.addPageToShow("index");
													}
													
													TmpModel.debugOutput.add("controllerFinishPay chek printed. operation:"+TmpModel.payment.operation+" payBack:"+TmpModel.payment.payBack+' '+JSON.stringify(variables));
													controllerFinishPay();
												});
			}
			else if (action=='ValOff') 
			{
				controllerValidatorOff();
			}
			else if (action=='payBack') 
			{
				TmpModel.debugOutput.add("controllerFinishPay payBack "+TmpModel.payment.payBack);
				if (TmpModel.payment.payBack>0)
				{
					// выбор сдачи
					// укороченный вариант
					TmpModel.acceptor.checkDispence( 	function (variables:Object):void 
														{
															TmpModel.debugOutput.add("controllerFinishPay Dispence:"+JSON.stringify(variables));
															if (variables['Dispence'] == "true") 
															{
																TmpModel.debugOutput.add("controllerFinishPay есть сдача");
																//TmpModel.payment.addAction('payBack');//TODO: это перепроверка - может закольцеваться
																
																TmpModel.screenController.showScreenByName("coinout");
																//TmpModel.acceptor.startDispence(TmpModel.tmpGlobalController.mediatorDispenceEnd);
																TmpModel.acceptor.startDispence(null);
															}else
															{
																TmpModel.debugOutput.add("controllerFinishPay нет сдачи");
																// нет сдачи
																controllerFinishPay();// должен уйти на печать чека
															}
														});
				}else {
					controllerFinishPay();
				}
			}
			else if (action=='createPay') 
			{	
				//TODO: все очень плохо из за необходимости сохранять данные - нужна какая то обработка ошибок пересохраняющая данные
														TmpModel.acceptor.createPay(	function (variables:Object):void 
																						{
																							if (variables["PaySuccess"] == "true") 
																							{						
																								TmpModel.payment.operation = "";
																								TmpModel.debugOutput.add("Pay created");
																								
																								var pg:String = TmpModel.payment.getPage();
																								if (pg == "") pg = "index";
																								TmpModel.payment.addPageToShow(pg);
																								
																								if (TmpModel.payment.provider.useChange)
																								{
																									if (TmpModel.payment.forEnrollment == TmpModel.payment.fixPrice) // оплачено
																									{
																										if (TmpModel.payment.provider.folder == "wc") 
																										{
																											//pg = TmpModel.payment.getPage();
																											//TmpModel.payment.addPageToShow('index');
																											TmpModel.payment.addPageToShow("wc_direction");
																										}
																									}
																									TmpModel.payment.addAction('printCheck');
																									TmpModel.payment.addAction('payBack');
																								}else 
																								{
																									if (TmpModel.payment.forEnrollment >0) // бредовый случай. таймаут на момент использования сдачи. когда включен купюрник.
																									{
																										TmpModel.payment.addPageToShow('finish_pay');
																									}
																								}
																								controllerFinishPay();
																							}else 
																							{
																								//TODO: не создался платеж? причины? решение?
																							}
																						});
			}else 
			{
				// переходим к показу страниц
				var page:String = TmpModel.payment.getPage();
				TmpModel.debugOutput.add("controllerFinishPay page:"+page);
				TmpModel.screenController.showScreenByName(page);
			}
		}
		
		public function mediatorCashSumm():void 
		{
			(TmpModel.screenController.getConteiner().getChildByName("pay") as ScreenPay).changeAmount();
		}
		//public function mediatorDispenceEnd(variables:Object):void 
		//{
			//(TmpModel.screenController.getConteiner().getChildByName("coinout") as ScreenCoinOUT).payBackEnd();
		//}
		
		//TODO: тут должны быть не кнопки а действия (выбран провайдер. начало оплаты и т.д.) действия и параметры нужно запоминать и потом откатываться к ним по кнопке back
		//TODO: отдельные медиатор для всех кнопок перехода по страницам? думаю будет ок!
		public function onClick(btnType:String,prop:Array=null):void 
		{
			TmpModel.debugOutput.add('onClick '+btnType)
			if (btnType == 'back' || btnType == 'menu') //+
			{
				controllerClick(btnType);
			}
			else if (btnType == 'confirm_phone') //+
			{		
				TmpModel.screenController.showScreenByName("confirm_phone");
				ExternalInterface.call("callFromFlash", TmpModel.payment.accountId);
			}
			else if (btnType == 'search') //+
			{
				TmpModel.screenController.showScreenByName("search");
			}
			else if (btnType == 'confirm_userdata') //+
			{
				TmpModel.screenController.showScreenByName("confirm_userdata");
			}
			else if (btnType == 'submitexcode') //+
			{
				TmpModel.acceptor.checkChange(prop.join(','), 	function(variables:Object):void 
																{
																	TmpModel.debugOutput.add(prop.join(',') + " === " + variables["Change"]);
																	var change:Array = String(variables["Change"]).split(',');
																	
																	var end:Array = [];
																	for (var i:int = 0; i < change.length; i++) 
																	{
																		if (change[i] != "0") end.push(prop[i]);
																	}
																	
																	//ExternalInterface.call("validatePaycode", end.join(','));
																	TmpModel.payment.operation = end.join(',');
																	TmpModel.screenController.gotoIndexHTML();
																});
			}
			else if (btnType == 'oferta') //+
			{
				TmpModel.screenController.showScreenByName("oferta");
			}
			else if (btnType == 'wcservice') //+
			{
				TmpModel.screenController.showScreenByName("wc_login");
			}
			else if (btnType == 'info') //+
			{
				TmpModel.screenController.showScreenByName("info");
			}
			else if (btnType == 'wc_servise') //+
			{
				TmpModel.screenController.showScreenByName("wc_servise");
			}
		}
		
		//------------------------------------------------------------
		
		// 
		public function eventDispatcherMap(eventType:String,...prop):void 
		{
			switch (eventType) 
			{
				case BillAcceptor.LOCKED:
					TmpModel.screenController.lock();
				break;
				case "end_work":
					TmpModel.screenController.endWork();
				break;
				
				//case ScreenManagerModel.SCREEN_MANAGER_MODEL_CHANGE:
					//TmpModel.screenManager.showScreen();
				//break;
			}
		}
	}
}